const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const svgCaptcha = require('svg-captcha');

// 存储验证码的临时对象（实际生产环境应使用Redis等）
const verificationCodes = {};
const captchas = {};

// 生成随机验证码
function generateVerificationCode() {
  return Math.floor(100000 + Math.random() * 900000).toString();
}

// 获取图片验证码
router.get('/captcha', (req, res) => {
  try {
    // 生成svg验证码
    const captcha = svgCaptcha.create({
      size: 4, // 验证码长度
      ignoreChars: '0o1il', // 排除容易混淆的字符
      noise: 2, // 干扰线条数
      color: true, // 彩色
      width: 120,
      height: 40
    });
    
    // 生成一个随机的会话ID
    const sessionId = Date.now().toString() + Math.random().toString().slice(2, 8);
    
    // 存储验证码（10分钟有效期）
    captchas[sessionId] = {
      text: captcha.text.toLowerCase(),
      expiresAt: Date.now() + 10 * 60 * 1000
    };
    
    // 设置Cookie以便识别用户
    res.cookie('captchaId', sessionId, { maxAge: 10 * 60 * 1000, httpOnly: true });
    
    // 返回SVG
    res.type('svg');
    res.status(200).send(captcha.data);
  } catch (error) {
    console.error('生成图片验证码错误:', error);
    res.status(500).json({ error: '服务器错误' });
  }
});

// 获取验证码接口
router.get('/verification-code', (req, res) => {
  try {
    const { email } = req.query;
    
    if (!email) {
      return res.status(400).json({ error: '请提供邮箱地址' });
    }
    
    // 生成6位数字验证码
    const code = generateVerificationCode();
    
    // 存储验证码（5分钟有效期）
    verificationCodes[email] = {
      code,
      expiresAt: Date.now() + 5 * 60 * 1000
    };
    
    // 实际应用中应通过邮件发送，这里直接返回
    // 注意：生产环境不应直接返回验证码，应该通过邮件服务发送
    res.json({ message: '验证码已发送', code });
  } catch (error) {
    console.error('生成验证码错误:', error);
    res.status(500).json({ error: '服务器错误' });
  }
});

// 注册
router.post('/register', async (req, res) => {
  try {
    const { email, password, verificationCode } = req.body;
    
    if (!email || !password || !verificationCode) {
      return res.status(400).json({ error: '邮箱、密码和验证码都是必填项' });
    }
    
    // 验证验证码
    const storedVerification = verificationCodes[email];
    if (!storedVerification) {
      return res.status(400).json({ error: '请先获取验证码' });
    }
    
    if (storedVerification.expiresAt < Date.now()) {
      // 删除过期验证码
      delete verificationCodes[email];
      return res.status(400).json({ error: '验证码已过期，请重新获取' });
    }
    
    if (storedVerification.code !== verificationCode) {
      return res.status(400).json({ error: '验证码错误' });
    }
    
    // 验证通过，清除验证码
    delete verificationCodes[email];
    
    if (password.length < 6) {
      return res.status(400).json({ error: '密码长度至少为6位' });
    }

    // 检查邮箱是否已注册
    const checkEmailResult = global.db.exec(`SELECT id FROM users WHERE email = '${email.replace(/'/g, "''")}'`);
    if (checkEmailResult.length > 0 && checkEmailResult[0].values.length > 0) {
      return res.status(400).json({ error: '邮箱已被注册' });
    }

    // 加密密码
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(password, salt);
    
    // 获取当前时间
    const now = new Date().toISOString();

    // 创建用户
    const stmt = global.db.prepare(
      'INSERT INTO users (email, password_hash, motivation_score, created_at) VALUES (?, ?, ?, ?)'
    );
    stmt.run([email, hashedPassword, 50, now]);
    
    // 获取用户ID
    const userIdResult = global.db.exec('SELECT last_insert_rowid() as id')[0];
    const userId = userIdResult.values[0][0];
    
    // 保存数据库
    global.saveDatabase();

    // 生成JWT令牌
    const token = jwt.sign({ userId }, process.env.JWT_SECRET, { expiresIn: '7d' });

    res.json({ token });
  } catch (error) {
    console.error('注册错误:', error);
    res.status(500).json({ error: '服务器错误' });
  }
});

// 登录
router.post('/login', async (req, res) => {
  try {
    const { email, password, verificationCode } = req.body;
    const captchaId = req.cookies.captchaId;

    // 验证图形验证码
    if (!verificationCode || !captchaId || !captchas[captchaId]) {
      return res.status(400).json({ error: '请刷新并输入验证码' });
    }

    const storedCaptcha = captchas[captchaId];
    if (storedCaptcha.expiresAt < Date.now()) {
      delete captchas[captchaId];
      return res.status(400).json({ error: '验证码已过期，请刷新验证码' });
    }

    if (storedCaptcha.text !== verificationCode.toLowerCase()) {
      return res.status(400).json({ error: '验证码错误' });
    }

    // 验证通过，清除验证码
    delete captchas[captchaId];

    // 查找用户
    const stmt = global.db.prepare('SELECT * FROM users WHERE email = ?');
    const user = stmt.getAsObject([email]);
    
    if (!user.id) {
      return res.status(401).json({ error: '邮箱或密码错误' });
    }

    // 验证密码
    const validPassword = await bcrypt.compare(password, user.password_hash);
    if (!validPassword) {
      return res.status(401).json({ error: '邮箱或密码错误' });
    }

    // 生成JWT令牌
    const token = jwt.sign(
      { userId: user.id },
      process.env.JWT_SECRET,
      { expiresIn: '7d' }
    );

    res.json({ token, userId: user.id });
  } catch (error) {
    console.error('登录错误:', error);
    res.status(500).json({ error: '服务器错误' });
  }
});

module.exports = router; 